home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / sharew / musik / bytes / midistdf.gfa (.txt) < prev    next >
Encoding:
GFA-BASIC Atari  |  1989-04-05  |  14.6 KB  |  602 lines

  1. '
  2. ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  3. '  Sequenzerprogramm mit Abspeichermöglichkeit als MIDI Standard File
  4. '  geschrieben in GFA-BASIC 3.5E D, (C)1993 Stephan M. Sprenger
  5. '  PROSONIQ PRODUCTS SOFTWARE, Badenwerkstraße 9, 76137 Karlsruhe
  6. ' .............................................................................
  7. '
  8. '
  9. $I+             ! Compiler-Option: Interrupts initialisieren
  10. $P>             ! Compiler-Option: GFA-Konvention für Procedures
  11. '
  12. mtc!=FALSE      ! Synchronisation: FALSE=intern, TRUE=MIDI Clock
  13. click|=1        ! Metronom: 1=Metronom an, 0=Metronom aus
  14. tempo#=0.01      ! Tempo:  Aufzeichnungs- und Abspielgeschwindigkeit
  15. '
  16. @init           ! Programm initialisieren
  17. @standby        ! Hauptschleife des Programms
  18. '
  19. ' Unter-Routinen zum Programm
  20. '
  21. PROCEDURE init
  22.   OPENW 0                               ! Bildschirm und Fenster...
  23.   DEFMOUSE 0
  24.   TITLEW #1," SEQUENCER "
  25.   INFOW #1," "
  26.   OPENW #1,20,150,600,100,0
  27.   CLS
  28.   dm#=FRE(0)/15
  29. ' ## INLINE:
  30. ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  31. ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  32. ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  33. ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  34. ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  35. ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  36. ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  37. ' $0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  38. ' $0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  39. ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  40. ' $00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  41. ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  42. ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  43. ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  44. ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  45. ' $00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  46. ' $0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  47. ' $0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  48. ' $0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  49. ' $0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  50. ' $0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  51. ' $0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  52. ' $0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  53. ' $0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  54. ' $0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  55. ' $0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  56. ' $01a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  57. ' $01b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  58. ' $01c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  59. ' $01d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  60. ' $01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  61. ' $01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  62. ' $0200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  63. ' $0210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  64. ' $0220: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  65. ' $0230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  66. ' $0240: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  67. ' $0250: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  68. ' $0260: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  69. ' $0270: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  70. ' $0280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  71. ' $0290: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  72. ' $02a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  73. ' $02b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  74. ' $02c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  75. ' $02d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  76. ' $02e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  77. ' $02f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  78. ' $0300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  79. ' $0310: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  80. ' $0320: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  81. ' $0330: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  82. ' $0340: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  83. ' $0350: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  84. ' $0360: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  85. ' $0370: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  86. ' $0380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  87. ' $0390: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  88. ' $03a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  89. ' $03b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  90. ' $03c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  91. ' $03d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  92. ' $03e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  93. ' $03f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  94. ' $0400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  95. ' $0410: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  96. ' $0420: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  97. ' $0430: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  98. ' $0440: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  99. ' $0450: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  100. ' $0460: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  101. ' $0470: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  102. ' $0480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  103. ' $0490: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  104. ' $04a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  105. ' $04b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  106. ' $04c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  107. ' $04d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  108. ' $04e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  109. ' $04f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  110. ' $0500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  111. ' $0510: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  112. ' $0520: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  113. ' $0530: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  114. ' $0540: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  115. ' $0550: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  116. ' $0560: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  117. ' $0570: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  118. ' $0580: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  119. ' $0590: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  120. ' $05a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  121. ' $05b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  122. ' $05c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  123. ' $05d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  124. ' $05e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  125. ' $05f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  126. ' $0600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  127. ' $0610: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  128. ' $0620: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  129. ' $0630: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  130. ' $0640: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  131. ' $0650: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  132. ' $0660: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  133. ' $0670: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  134. ' $0680: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  135. ' $0690: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  136. ' $06a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  137. ' $06b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  138. ' $06c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  139. ' $06d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  140. ' $06e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  141. ' $06f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  142. ' $0700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  143. ' $0710: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  144. ' $0720: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  145. ' $0730: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  146. ' $0740: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  147. ' $0750: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  148. ' $0760: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  149. ' $0770: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  150. ' $0780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  151. ' $0790: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  152. ' $07a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  153. ' $07b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  154. ' $07c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  155. ' $07d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  156. ' $07e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  157. ' $07f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  158. ' $0800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  159. ' $0810: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  160. ' $0820: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  161. ' $0830: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  162. ' $0840: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  163. ' $0850: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  164. ' $0860: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  165. ' $0870: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  166. ' $0880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  167. ' $0890: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  168. ' $08a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  169. ' $08b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  170. ' $08c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  171. ' $08d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  172. ' $08e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  173. ' $08f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  174. ' $0900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  175. ' $0910: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  176. ' $0920: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  177. ' $0930: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  178. ' $0940: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  179. ' $0950: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  180. ' $0960: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  181. ' $0970: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  182. ' $0980: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  183. ' $0990: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  184. ' $09a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  185. ' $09b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  186. ' $09c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  187. ' $09d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  188. ' $09e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  189. ' $09f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  190. ' $0a00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  191. ' $0a10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  192. ' $0a20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  193. ' $0a30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  194. ' $0a40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  195. ' $0a50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  196. ' $0a60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  197. ' $0a70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  198. ' $0a80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  199. ' $0a90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  200. ' $0aa0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  201. ' $0ab0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  202. ' $0ac0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  203. ' $0ad0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  204. ' $0ae0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  205. ' $0af0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  206. ' $0b00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  207. ' $0b10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  208. ' $0b20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  209. ' $0b30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  210. ' $0b40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  211. ' $0b50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  212. ' $0b60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  213. ' $0b70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  214. ' $0b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  215. ' $0b90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  216. ' $0ba0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  217. ' $0bb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  218. ' $0bc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  219. ' $0bd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  220. ' $0be0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  221. ' $0bf0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  222. ' $0c00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  223. ' $0c10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  224. ' $0c20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  225. ' $0c30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  226. ' $0c40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  227. ' $0c50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  228. ' $0c60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  229. ' $0c70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  230. ' $0c80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  231. ' $0c90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  232. ' $0ca0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  233. ' $0cb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  234. ' $0cc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  235. ' $0cd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  236. ' $0ce0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  237. ' $0cf0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  238. ' $0d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  239. ' $0d10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  240. ' $0d20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  241. ' $0d30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  242. ' $0d40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  243. ' $0d50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  244. ' $0d60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  245. ' $0d70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  246. ' $0d80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  247. ' $0d90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  248. ' $0da0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  249. ' $0db0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  250. ' $0dc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  251. ' $0dd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  252. ' $0de0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  253. ' $0df0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  254. ' $0e00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  255. ' $0e10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  256. ' $0e20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  257. ' $0e30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  258. ' $0e40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  259. ' $0e50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  260. ' $0e60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  261. ' $0e70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  262. ' $0e80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  263. ' $0e90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  264. ' $0ea0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  265. ' $0eb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  266. ' $0ec0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  267. ' $0ed0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  268. ' $0ee0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  269. ' $0ef0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  270. ' $0f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  271. ' $0f10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  272. ' $0f20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  273. ' $0f30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  274. ' $0f40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  275. ' $0f50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  276. ' $0f60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  277. ' $0f70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  278. ' $0f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  279. ' $0f90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  280. ' 4000  Bytes.
  281.   INLINE midi_buffer%,4000
  282.   @midi_buffer(midi_buffer%,4000)       ! neuen System-MIDI-Puffer einrichten
  283.   ON BREAK GOSUB alter_buffer           ! alten Puffer bei Abbruch wiederherstellen
  284.   ON ERROR GOSUB alter_buffer           ! alten Puffer bei Fehler restaurieren
  285.   DIM dat$(dm#)                          ! Feld für MIDI-Daten
  286.   DIM time%(dm#)                         ! Feld für Absolutzeit
  287.   DIM d_len&(300)
  288.   OPEN "O",#99,"MID:"                   ! MIDI-Schnittstelle öffnen
  289. RETURN
  290. '
  291. PROCEDURE standby
  292.   DO
  293.     INFOW #1," Status: Stand-By     "+fn$
  294.     PRINT AT(13,2),"BAR: ";1''''" BEAT: ";1'''
  295.     key$=CHR$(INP(2))
  296.     IF key$="0"
  297.       INFOW #1," Status: Playback ... "+fn$
  298.       @playback
  299.     ELSE IF key$="*"
  300.       INFOW #1," Status: Recording ... "+fn$
  301.       @record
  302.     ELSE IF key$=CHR$(27)
  303.       @alter_buffer
  304.     ELSE IF key$="s" OR key$="S"
  305.       INFOW #1," Status: Saving MIDI Standard File ... "+fn$
  306.       @convert_mid(1,1)
  307.     ELSE IF key$="l" OR key$="L"
  308.       INFOW #1," Status: Loading MIDI Standard File ... "+fn$
  309.       @convert_mid(1,0)
  310.     ELSE IF INKEY$=CHR$(13)
  311.       @all_notes_off
  312.     ELSE
  313.       CLR key$
  314.     ENDIF
  315.   LOOP
  316. RETURN
  317. '
  318. PROCEDURE record
  319.   tm#=0
  320.   c%=1
  321.   VOID FRE(0)
  322.   dummy$=INPMID$                        ! MIDI-In-Puffer leeren ...
  323.   @anzeige
  324.   DO
  325.     IF mtc!=FALSE                       ! interne Synchronisation?
  326.       DELAY tempo#                       ! Ja, dann Pause und...
  327.       INC tm#                            ! ... Zähler erhöhen
  328.       @anzeige                          ! Position anzeigen...
  329.     ENDIF
  330.     IF INP?(3)                          ! MIDI-Daten liegen an?
  331.       in|=INP(3)                        ! Ja, dann lesen
  332.       IF in|>127                        ! Statusbyte ?
  333.         IF (in| AND &HF0)=144           ! Note-On ?
  334.           rb|=in|                       ! Statusbyte puffern
  335.           @get                          ! und Event aufzeichnen
  336.         ELSE IF (in| AND &HF0)=128      ! Note-Off ?
  337.           rb|=in|                       ! Statusbyte puffern
  338.           @get                          ! und Event aufzeichnen
  339.         ELSE IF in|=248 AND mtc!=TRUE   ! MIDI-Clock-Signal?
  340.           INC tm#                        ! Ja, dann Zähler erhöhen
  341.           @anzeige                      ! Position anzeigen...
  342.         ELSE
  343.           rb|=0                         ! andere Daten außer Noten ignorieren
  344.         ENDIF
  345.       ELSE
  346.         IF rb|<>0                       ! Letztes Statusbyte war Note-On/Off?
  347.           dat$(c%)=CHR$(rb|)+CHR$(in|)+CHR$(INP(3))   ! dann Byte speichern
  348.           time%(c%)=tm#                  ! Zeit speichern
  349.           INC c%                        ! Zähler erhöhen
  350.         ENDIF
  351.       ENDIF
  352.     ELSE
  353.       in|=0
  354.     ENDIF
  355.     last%=c%                            ! Variable für Spur-Ende
  356.     EXIT IF c%=>dm#-1 OR INKEY$=CHR$(13)
  357.   LOOP
  358. RETURN
  359. '
  360. PROCEDURE playback
  361.   tm#=0
  362.   c%=1
  363.   VOID FRE(0)
  364.   dummy$=INPMID$                        ! MIDI-In-Puffer leeren ...
  365.   DO                                    ! Wiedergabe-Schleife
  366.     IF INP?(3)
  367.       in|=INP(3)
  368.     ELSE
  369.       in|=0
  370.     ENDIF
  371.     IF in|=248 AND mtc!=TRUE            ! MIDI-Clock?
  372.       INC tm#                            ! Dann Uhr +1
  373.       @anzeige
  374.     ENDIF
  375.     IF mtc!=FALSE                       ! Interne Synchronisation?
  376.       DELAY tempo#                       ! Dann Uhr nach Pause +1
  377.       INC tm#
  378.       @anzeige
  379.     ENDIF
  380.     IF time%(c%)<=tm#                    ! nächstes Event schon dran?
  381.       PRINT #99,dat$(c%);               ! Ja, dann ausgeben
  382.       INC c%
  383.     ENDIF
  384.     EXIT IF c%=>dm#-1 OR c%=>last% OR INKEY$=CHR$(13)
  385.   LOOP
  386.   @all_notes_off                        ! Nach Beendigung alle Noten aus.
  387. RETURN
  388. '
  389. PROCEDURE get
  390.   dat$(c%)=CHR$(rb|)+CHR$(INP(3))+CHR$(INP(3))   ! Byte speichern
  391.   time%(c%)=tm#                                   ! Zeit speichern
  392.   INC c%                                         ! Zähler erhöhen
  393. RETURN
  394. '
  395. PROCEDURE anzeige
  396.   IF tm# MOD 24=0                      ! Anzeige von Takt und Viertel
  397.     PRINT AT(13,2),"BAR: ";TRUNC(tm#/96)+1''''" BEAT: ";((tm#/24) MOD 4)+1'''
  398.     PRINT CHR$(7*click|);
  399.   ENDIF
  400. RETURN
  401. '
  402. PROCEDURE ende
  403.   CLOSEW 1
  404.   CLOSEW 0
  405.   CLOSE
  406.   EDIT
  407. RETURN
  408. '
  409. PROCEDURE convert_mid(abs_rel|,save_load|)
  410.   '
  411.   ' speichert/lädt Daten als MIDI Standard File:
  412.   ' MIDI-Events in dat$(), Zeit als Clicks in time%()
  413.   '
  414.   ' Wenn Sie abs_rel| auf 1 setzen, erwartet die Routine in time%() die
  415.   ' Zeitangabe als Absolutzeit (also als Zeit seit Spuranfang); ist
  416.   ' abs_rel| Null, dann erwartet die Routine in time%() die seit dem
  417.   ' vorhergehenden Event verstrichene Zeit.
  418.   '
  419.   ' In dat$() befinden sich die zu speichernden MIDI-Events; diese müssen
  420.   ' pro Eintrag vollständig sein (ein Note-On liegt hier z.B. als
  421.   ' dat$(2)=CHR$(144)+CHR$(60)+CHR$(64) vor).
  422.   '
  423.   ' Wenn save_load|=1 ist wird gespeichert, bei save_load|=0 wird geladen
  424.   '
  425.   @convert_init                         ! Konvertierungsroutine einrichten
  426.   dummy$=INKEY$
  427.   FILESELECT "A:\*.MID","MIDIFILE.MID",fn$
  428.   DEFMOUSE 2
  429.   IF fn$="" OR fn$="\"
  430.     GOTO cancel
  431.   ENDIF
  432.   IF save_load|=1
  433.     OPEN "O",#1,fn$
  434.     PRINT #1,"MThd";                      ! **** Header-Block-Kennung ****
  435.     PRINT #1,MKL$(6);                     ! Länge des Headers
  436.     PRINT #1,MKI$(0);                     ! File Format (0)
  437.     PRINT #1,MKI$(1);                     ! Anzahl der Spuren
  438.     PRINT #1,MKI$(&H18);                  ! 24 Clicks pro Viertelnote (MIDI Clock)
  439.     PRINT #1,"MTrk";                      ! ***** Spur-Block-Kennung *****
  440.     PRINT #1,MKL$(0);                     ! Platzhalter für Blocklänge
  441.     PRINT #1,CHR$(0);                     ! Delta-Time des ersten Events
  442.     PRINT #1,CHR$(&HFF);                  ! Meta-Event: Spurname
  443.     PRINT #1,MKI$(&H108);                 ! (01=Text, 08=Textlänge)
  444.     PRINT #1,"MIDIFILE";                  ! Spurname
  445.     c%=0
  446.     DO
  447.       INC c%
  448.       VOID FRE(0)
  449.       r%=V:r$
  450.       IF abs_rel|=1                         ! time%() enthält Absolutzeit
  451.         LPOKE r%+6,(time%(c%)-time%(c%-1))  ! Zeit zwischen zwei Events
  452.       ELSE
  453.         LPOKE r%+6,time%(c%)                ! time%() enthält Delta-Time
  454.       ENDIF
  455.       POKE r%+2,1                           ! Opcode: 1=DEZ-->VLN, 0=VLN-->DEZ
  456.       d0#=C:r%()                             ! VLN-Routine aufrufen
  457.       FOR b|=0 TO 3                         ! Bytes in Datei schreiben...
  458.         IF PEEK(r%+6+b|)<>0
  459.           PRINT #1,CHR$(PEEK(r%+6+b|));
  460.         ENDIF
  461.       NEXT b|
  462.       PRINT #1,dat$(c%);                    ! MIDI-Daten in Datei ausgeben
  463.       EXIT IF c%=last%                      ! Abbrechen wenn Spurende
  464.     LOOP
  465.     PRINT #1,CHR$(0);                       ! Delta-time% zum Spurende
  466.     PRINT #1,CHR$(&HFF);MKI$(&H2F00);       ! Meta-Event: Spurende
  467.     CLOSE #1
  468.     OPEN "U",#1,fn$                         ! Datei nochmals öffnen
  469.     l%=LOF(#1)                              ! Länge ermitteln
  470.     SEEK #1,18                              ! Byte #18 anfahren
  471.     PRINT #1,MKL$(l%-18);                   ! Spurlänge eintragen
  472.   ELSE
  473.     c%=0                                   ! Zähler für Feldindex
  474.     z%=0                                   ! Zähler für Absolutzeit
  475.     b%=0                                   ! Zähler für gelesene Bytes
  476.     evt$=""
  477.     OPEN "I",#1,fn$                       ! Datei zum Lesen öffnen
  478.     id$=INPUT$(4,#1)                      ! Header-ID lesen
  479.     h_l%=CVL(INPUT$(4,#1))                ! Header-Länge lesen
  480.     ff&=CVI(INPUT$(2,#1))                 ! File-Typ lesen
  481.     anz&=CVI(INPUT$(2,#1))                ! Spuranzahl
  482.     res&=CVI(INPUT$(2,#1))                ! Auflösung
  483.     IF id$<>"MThd" OR ff%<>0              ! MIDI-File vom Typ 0?
  484.       ALERT 3,"Ungültiges Fileformat - |Fileheader",1," OK ",r#
  485.       GOTO cancel                         ! Nein, dann Abbruch
  486.     ENDIF
  487.     id$=INPUT$(4,#1)                      ! Track-ID lesen
  488.     b_l%=CVL(INPUT$(4,#1))                ! Länge der Spur
  489.     IF id$<>"MTrk"                        ! Track-ID prüfen
  490.       ALERT 3,"Ungültiges Fileformat - |Trackstruktur",1," OK ",r#
  491.       GOTO cancel                         ! Ungültig? dann raus
  492.     ENDIF
  493.     DO                                    ! Leseschleife
  494.       INC c%                              ! Zähler für Feld erhöhen
  495.       t$=""
  496.       DO                                  ! Leseschleife für Zeit
  497.         tim$=INPUT$(1,#1)                 ! Erstes Byte lesen
  498.         INC b%                            ! Bytezähler +1
  499.         t$=t$+tim$                        ! ersten Zeitwert bilden
  500.         EXIT IF ASC(tim$)<128             ! raus, wenn LSB gelesen
  501.       LOOP
  502.       VOID FRE(0)
  503.       t$=MID$(t$,1,4)
  504.       t$=STRING$(4-LEN(t$),0)+t$          ! Langwort bilden
  505.       r%=V:r$                             ! Adresse der Maschinenroutine
  506.       POKE r%+2,0                         ! Opcode: 0=VLN-->DEZ
  507.       LPOKE r%+6,CVL(t$)                  ! Wert übergeben
  508.       d0#=C:r%()                           ! Maschinenprogramm aufrufen
  509.       IF abs_rel|=0                       ! Relative Zeit benötigt?
  510.         time%(c%)=LPEEK(r%+6)/(res&/24)   ! dann Delta-Time ablegen
  511.       ELSE                                ! Absolutzeit?
  512.         z%=z%+LPEEK(r%+6)                 ! dann Zeit bilden...
  513.         time%(c%)=z%/(res&/24)            ! ...und in interne Auflösung umrechnen
  514.       ENDIF
  515.       evt$=INPUT$(1,#1)                   ! Event, erstes Byte lesen
  516.       INC b%                              ! wieder ein Byte mehr...
  517.       rb|=(ASC(evt$)) AND &HF0            ! nur Hi-Nibble wird benötigt
  518.       IF d_len&(rb|)=0                    ! Event-Typ ist nicht bekannt?
  519.         ALERT 3,"ERROR:|Unbekanntes MIDI-Event",1,"CANCEL",r#
  520.         EXIT IF r#=1                       ! dann nix wie raus...
  521.       ENDIF
  522.       IF evt$=CHR$(&HFF)                  ! Event ist Meta-Event...
  523.         m_type&=ASC(INPUT$(1,#1))         ! ...dann Event-Typ feststellen
  524.         m_l&=ASC(INPUT$(1,#1))            ! Länge feststellen
  525.         RELSEEK #1,m_l&                   ! Meta-Event ignorieren...
  526.         b%=b%+m_l&+2                      ! ...und überspringen
  527.         EXIT IF m_type&=&H2F              ! raus wenn Meta-Event = Spurende
  528.       ELSE
  529.         dat$(c%)=evt$+INPUT$(d_len&(rb|)-1,#1) ! wenn normales MIDI-Event...
  530.         b%=b%+d_len&(rb|)                 ! ... dann lesen und speichern
  531.       ENDIF
  532.     LOOP
  533.     last%=c%                              ! Spurende
  534.   ENDIF
  535. cancel:
  536.   CLOSE #1                                ! Datei schließen
  537.   DEFMOUSE 0                              ! Biene wegzaubern
  538. RETURN
  539. '
  540. PROCEDURE convert_init
  541.   '
  542.   ' Initialisierung der VLN/Dezimal-Routine.
  543.   ' Die in r$ abgelegte Maschinenroutine erwartet in V:r$+2 als Byte den
  544.   ' Opcode der auszuführenden Berechnung (0=VLN in Dezimalwert umrechnen,
  545.   ' 1=Dezimalwert in VLN umrechnen) und in V:r$+6 den umzurechnenden Wert.
  546.   ' Nach Aufruf der Routine kann von dort auch der berechnete Wert gelesen
  547.   ' werden (Langwort). Die Wertübergabe über die Speicherstelle habe ich
  548.   ' gewählt, weil die Übergabe über den Stack bei meiner GFA-Version nicht
  549.   ' korrekt funktioniert.
  550.   '
  551.   r$=MKL$(&H60080000)+MKL$(0)+MKL$(&H41FA)+MKL$(&HFFF62228)
  552.   r$=r$+MKL$(&H44A10)+MKL$(&H6754B2BC)+MKL$(&HFFFFFFF)+MKL$(&H62407003)
  553.   r$=r$+MKL$(&HE389E209)+MKL$(&H8810007)+MKL$(&HB07C0003)+MKL$(&H67084A01)
  554.   r$=r$+MKL$(&H670408C1)+MKL$(&H71401)+MKL$(&HE09AE089)+MKL$(&H51C8FFE2)
  555.   r$=r$+MKL$(&H8020017)+MKL$(&H670408C2)+MKL$(&HF0802)+MKL$(&H1F6706)
  556.   r$=r$+MKL$(&H820080)+MKL$(&H80002142)+MKL$(&H47000)+MKL$(&H4E75217C)
  557.   r$=r$+MKL$(&HFFFFFFF7)+MKL$(&H470FF)+MKL$(&H4E75B2BC)+MKL$(&HFFFFFFF7)
  558.   r$=r$+MKL$(&H62167003)+MKL$(&H1401EE9A)+MKL$(&HE08951C8)+MKL$(&HFFF8E89A)
  559.   r$=r$+MKL$(&H2820FFF)+MKL$(&HFFFF60CE)+MKL$(&H217C0FFF)+MKL$(&HFFFF0004)
  560.   r$=r$+MKL$(&H70FF4E75)
  561.   '
  562.   '
  563.   d_len&(128)=3                         ! Note-Off,Befehlslänge 3 Bytes
  564.   d_len&(144)=3                         ! Note-On, Befehlslänge 3 Bytes
  565.   d_len&(160)=3                         ! Poly Pressure
  566.   d_len&(176)=3                         ! Control Change
  567.   d_len&(192)=2                         ! Program Change
  568.   d_len&(208)=2                         ! Channel Pressure
  569.   d_len&(224)=3                         ! Pitch Wheel Change
  570.   d_len&(&HF0)=&HFF                     ! Meta-Event darf keinen Fehler erzeugen
  571.   '
  572.   ' Es können hier weitere Befehlslängen für MIDI-Nachrichten eingetragen werden
  573.   '
  574. RETURN
  575. '
  576. PROCEDURE midi_buffer(neue_adresse%,laenge%)
  577.   adresse%=XBIOS(14,2)
  578.   alte_buffer_adresse%=LPEEK(adresse%)
  579.   SLPOKE adresse%+6,0
  580.   SLPOKE adresse%,neue_adresse%
  581.   SDPOKE adresse%+4,laenge%
  582. RETURN
  583. '
  584. PROCEDURE alter_buffer
  585.   adresse%=XBIOS(14,2)
  586.   SLPOKE adresse%,alte_buffer_adresse%
  587.   alte_buffer_adresse%=0
  588.   alter_buffer%=0
  589.   @ende                         ! Programm verlassen
  590. RETURN
  591. '
  592. PROCEDURE all_notes_off
  593.   FOR chan|=0 TO 15             ! Alle Kanäle durchgehen...
  594.     FOR note|=0 TO 127          ! Alle Noten durchgehen...
  595.       IF note|=0                ! Erstes Note-Off normal..
  596.         OUT 3,128+chan|
  597.       ENDIF
  598.       OUT 3,note|,0             ! ..den Rest im Running-Mode
  599.     NEXT note|                  ! senden (geht schneller)
  600.   NEXT chan|
  601. RETURN
  602.